import type { PropType } from "vue";

export const unknownProp = null as unknown as PropType<unknown>;

export const numericProp = [Number, String];

export const truthProp = {
  type: Boolean,
  default: true as const,
};

export const makeRequiredProp = <T>(type: T) => ({
  type,
  required: true as const,
});

export const makeArrayProp = <T>() => ({
  type: Array as PropType<T[]>,
  default: () => [],
});

export const makeBooleanProp = <T>(defaultVal: T) => ({
  type: Boolean,
  default: defaultVal,
});

export const makeNumberProp = <T>(defaultVal: T) => ({
  type: Number,
  default: defaultVal,
});

export const makeNumericProp = <T>(defaultVal: T) => ({
  type: numericProp,
  default: defaultVal,
});

export const makeStringProp = <T>(defaultVal: T) => ({
  type: String as unknown as PropType<T>,
  default: defaultVal,
});

export const baseProps = {
  /**
   * 自定义根节点样式
   */
  customStyle: makeStringProp(""),
  /**
   * 自定义根节点样式类
   */
  customClass: makeStringProp(""),
};

/**
 * 必填props类型
 *
 * @export
 * @class RequiredProp
 * @template T
 * @template D
 * @template V
 */
export class RequiredProp<T, D = undefined, V = undefined> {
  readonly required = true;

  type: T;

  default?: D | undefined;

  validator?: V | undefined;

  constructor(type: T, _default?: D, validator?: V) {
    if (_default) {
      this.default = _default;
    }
    if (validator) {
      this.validator = validator;
    }
    this.type = type;
  }
}

export const FORM_KEY = Symbol('form-base')